package org.ym.database.hibernate.base;

import com.google.gson.JsonObject;
import org.springframework.data.domain.Page;
import org.ym.database.hibernate.query.QueryFilter;

import java.util.List;
import java.util.Optional;

/**
 * @author ym
 */
public interface BaseInterface<T extends BaseModel,ID> {
    /**
     * 查询所有数据
     * @param queryFilter 查询条件
     * @param classZ 当前类
     * @return 数据
     */
    List<T> queryAll(QueryFilter queryFilter, Class<T> classZ);
    /**
     * 分页查询数据
     * @param queryFilter 查询条件
     * @param classZ 当前类
     * @return 数据
     */
    Page<T> queryPage(QueryFilter queryFilter, Class<T> classZ);
    /**
     * 查询数量
     * @param queryFilter 查询条件
     * @param classZ 当前类型
     * @return 数量
     */
    long count(QueryFilter queryFilter,Class<T> classZ);
    /**
     * 保存数据，不会立刻刷新到数据库，慎用该方法。
     * @param model 对象
     * @return 保存后对象
     */
    T save(T model);
    /**
     * 保存并刷新到数据库
     * @param model 对象
     * @return 保存的对象
     */
    T saveAndFlush(T model);
    /**
     * 保存所有，不flush
     * @param modelList 数据
     * @return 数据
     */
    List<T> saveAll(List<T> modelList);
    /**
     * 保存所有,flush数据
     * @param modelList 数据
     * @return 数据
     */
    List<T> saveAllAndFlush(List<T> modelList);
    /**
     * 插入数据
     * @param model 新数据
     * @return 保存后数据
     */
    T insert(T model);
    /**
     * 插入数据,并flush
     * @param model 新数据
     * @return 保存后数据
     */
    T insertAndFlush(T model);
    /**
     * 批量插入所有数据,不执行校验
     * @param modelList 新数据
     * @return 保存后数据
     */
    List<T> insertAll(List<T> modelList);
    /**
     * 批量插入所有数据,不执行校验,并且flush
     * @param modelList 新数据
     * @return 保存后数据
     */
    List<T> insertAllAndFlush(List<T> modelList);
    /**
     * 更新数据
     * @param model 新数据
     * @return 保存后数据
     */
    T update(T model);
    /**
     * 插入数据,并flush
     * @param model 新数据
     * @return 保存后数据
     */
    T updateAndFlush(T model);
    /**
     * 批量插入所有数据,不执行校验
     * @param modelList 新数据
     * @return 保存后数据
     */
    List<T> updateAll(List<T> modelList);
    /**
     * 批量插入所有数据,不执行校验,并且flush
     * @param modelList 新数据
     * @return 保存后数据
     */
    List<T> updateAllAndFlush(List<T> modelList);
    /**
     * 根据id获取数据
     * @param id 主键
     * @return 数据
     */
    Optional<T> getById(ID id);

    /**
     * 根据idList获取数据
     * @param idList id集合
     * @return 数据
     */
    List<T> getByIds(List<ID> idList);
    /**
     * 根据model集合删除数据
     * @param modelArray model集合数据
     */
    void delByModelList(T[] modelArray);
    /**
     * 根据model集合删除数据
     * @param modelList model集合数据
     */
    void delByModelList(List<T> modelList);
    /**
     * 删除数据
     * @param id 主键
     */
    void delById(ID id);
    /**
     * 批量删除数据
     * @param idArray id数组
     */
    void delByIds(ID[] idArray);
    /**
     * 批量删除数据
     * @param idList id集合
     */
    void delByIds(List<ID> idList);
    /**
     * 查询所有数据,支持min、max、分组查询等
     * @param queryFilter 查询条件
     * @param classZ 表类
     * @return 数据
     */
    List<Object> query(QueryFilter queryFilter, Class<T> classZ);
    /**
     * 查询所有数据，并把查询结果转换成JsonObject
     * @param queryFilter 查询条件
     * @param classZ 表类
     * @return 数据集
     */
    List<JsonObject> queryAsJsonObject(QueryFilter queryFilter, Class<T> classZ);
}
